package cn.jingyuan.swan.cloud.dao;

import java.io.Serializable;
import java.util.List;

/**
 * 数据存取接口
 *
 * @param <E>  实体
 * @param <ID> 主键
 */
public interface CrudDao<E, ID extends Serializable> extends EmptyDao<E, ID> {

    /**
     * 插入单条数据
     *
     * @param entity {@link E entity}
     *
     * @return 插入条数
     */
    int insert(E entity);

    /**
     * 插入多条数据
     *
     * @param entities {@link List< E > entities}
     *
     * @return 插入条数
     */
    int inserts(List<E> entities);

    /**
     * 依据 {@link ID id} 删除
     *
     * @param id {@link ID id}
     *
     * @return 删除条数
     */
    int delete(ID id);

    /**
     * 依据给定 {@link List<ID> ids} 删除
     *
     * @param ids {@link List<ID> ids}
     *
     * @return 删除条数
     */
    int deletes(List<ID> ids);

    /**
     * 删除全部
     *
     * @return 删除条数
     */
    int deleteAll();

    /**
     * 依据 {@link E entity} 的 {@link ID id} 更新
     *
     * @param entity {@link E entity}
     *
     * @return 更新条数
     */
    int update(E entity);

    /**
     * 依据 {@link E entity} 的 {@link ID id} 更新给定的 {@link List< E > entities}
     *
     * @param entities {@link List< E > entities}
     *
     * @return 更新条数
     */
    int updates(List<E> entities);

    /**
     * 通过 {@link ID id} 检索 {@link E entity}
     *
     * @param id {@link ID id}
     *
     * @return {@link E entity}
     */
    E get(ID id);

    /**
     * 通过给定的 {@link ID ids} 检索 {@link E entity}
     *
     * @param ids {@link ID ids}
     *
     * @return {@link List< E > entities}
     */
    List<E> gets(List<ID> ids);

    /**
     * 获取所有数据
     *
     * @return {@link List< E > entities}
     */
    List<E> getAll();

    /**
     * 检索全部条数
     *
     * @return 全部条数
     */
    int count();

    /**
     * 检索给定 {@link ID ids} 的条数
     *
     * @param ids {@link ID ids}
     *
     * @return 检索条数
     */
    int countOfIds(List<ID> ids);

}
